package lanqiao;
import java.math.BigDecimal;
import java.util.*;
/**
 * Prev_12C 直线【第十二届】【省赛】【B组】
 * 在平面直角坐标系中，两点可以确定一条直线。如果有多点在一条直线上， 那么这些点中任意两点确定的直线是同一条。
 * 给定平面上 2 × 3 个整点 {(x, y)|0 ≤ x < 2, 0 ≤ y < 3, x ∈ Z, y ∈ Z}，
 * 即横坐标是 0 到 1 (包含 0 和 1) 之间的整数、纵坐标是 0 到 2 (包含 0 和 2) 之间的整数的点。
 * 这些点一共确定了 11 条不同的直线。
 * 给定平面上 20 × 21 个整点 {(x, y)|0 ≤ x < 20, 0 ≤ y < 21, x ∈ Z, y ∈ Z}，
 * 即横坐标是 0 到 19 (包含 0 和 19) 之间的整数、纵坐标是 0 到 20 (包含 0 和 20) 之间的整数的点。
 * 请问这些点一共确定了多少条不同的直线。
 * 答案：40257
 */
public class Prev_12C {
    public static void main(String[] args) {
        Set<KAndB> set = new HashSet<>();
        for(double x1 = 0; x1 < 20; x1++){
            for(double y1 = 0; y1 < 21; y1++){
                for(double x2 = 0; x2 < 20; x2++){
                    for(double y2 = 0; y2 < 21; y2++){
                        //保证不在同一点
                        if(x1 != x2 && y1 != y2){
                            double k = (y2-y1)/(x2-x1);
                            double b = y2 - k * x2;
                            set.add(new KAndB(k, b));
                        }
                    }
                }
            }
        }
        System.out.println(set.size() + 19 + 20);
    }
}

class KAndB {

    double k;
    double b;

    public KAndB(double k, double b) {
        this.k = k;
        this.b = b;
    }

    @Override
    public boolean equals(Object o) {
        KAndB o2 = (KAndB) o;
        return Math.abs(o2.k-this.k)<0.000000001 && Math.abs(o2.b-this.b)<0.000000001;
    }

    @Override
    public int hashCode() {
        return Objects.hash(k, b);
    }
}